package com.itHsuDS.queue;

public class CircleArrayQueueDemo {
}

class CircleArray{
    private int maxSize;//数组的最大容量
    private int front;//队头：front变量的含义做一个调整：front指向队列的第一个元素，也就是说arr[front]就是队列的第一个元素
                      //     front的初始值为0
    private int rear;//队尾：rear变量的含义做一个调整：rear指向队列的最后一个元素的后一个位置，因为希望空出一个空间作为约定
                     //     rear的初始值为0
    private int[] arr;//该数组用于存放数据

    //创建队列的构造器
    public CircleArray(int arrMaxSize) {
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        front = 0;
        rear = 0;
    }

    //判断队列是否满
    public boolean isFull() {
        return (rear+1)%maxSize == front;
    }

    //判断队列是否空
    public boolean isEmpty() {
        return rear == front;
    }

    //添加数据到队列，入队
    public void addQueue(int n) {
        //判断队列是否满
        if (isFull()) {
            System.out.println("队列已满，无法添加数据~");
            return;
        }
        //直接将数据加入
        arr[rear]=n;
        //将rear后移，必须考虑取模
        rear=(rear+1)%maxSize;
    }

    //获取队列的数据，出队
    public int getQueue() {
        //判断队列是否空
        if (isEmpty()) {
            //通过抛出异常
            throw new RuntimeException("队列空，无法获取数据~");
            //return -1;不能这么写是因为可能那个数值就是-1，所以可以抛出异常
        }
        //这里需要分析出front是指向队头第一个元素
        //1、先把front的值保存到一个临时变量
        //2、将front后移，考虑取模
        //3、将临时保存的变量返回
        int value=arr[front];
        front=(front+1)%maxSize;
        return value;
    }

    //显示队列的所有数据
    public void showQueue() {
        //判断队列是否空
        if (isEmpty()) {
            System.out.println("队列为空，没有数据~");
            return;
        }
        //思路：从front开始遍历，遍历多少个元素就可以了
        for (int i = front; i < front+size(); i++) {//因为这里是 front+size() 所以可能越界，所以下面是 i%maxSize
            System.out.println("arr[" + i%maxSize + "]=" + arr[i%maxSize]);
        }

    }

    //求出当前队列有效数据的个数
    public int size(){
        return (rear+maxSize-front)%maxSize;
    }

    //显示队列的头数据
    public int headQueue() {
        //判断队列是否空
        if (isEmpty()) {
            throw new RuntimeException("队列空，无法显示数据~");
        }
        return arr[front];
    }
}